<?php

/**
 * 邮件基础配置及发送功能
 * @param string $to          接收地址
 * @param string $subject     主题
 * @param string $body        内容
 * @param string $name        接收人姓名
 * @param type $attachment    附件
 * @return type               true或错误信息
 */
function send_mail($to = '', $subject = '', $body = '', $name = '', $attachment = null)
{
    $from_email = C('MAIL_FROM');
    $from_name = C('MAIL_FROMNAME');
    $reply_email = '';
    $reply_name = '';
    require_once('./ThinkPHP/Library/Vendor/PHPMailer/class.phpmailer.php');

    $mail = new PHPMailer();                                //实例化PHPMailer
    $mail->CharSet = 'UTF-8';                               //设定邮件编码，默认ISO-8859-1，如果发中文此项必须设置，否则乱码
    $mail->IsSMTP();                                        // 设定使用SMTP服务
    $mail->SMTPDebug = 0;                                   // 关闭SMTP调试功能
    $mail->SMTPAuth = true;                                 // 启用 SMTP 验证功能
   // $mail->SMTPSecure = 'ssl';                            // 使用安全协议

    $mail->Host = C('MAIL_HOST');                           // SMTP 服务器
    $mail->Port = C('MAIL_PORT');                           // SMTP服务器的端口号
    $mail->Username = C('MAIL_USERNAME');                   // SMTP服务器用户名
    $mail->Password = C('MAIL_PASSWORD');                   // SMTP服务器密码
    $mail->SetFrom($from_email, $from_name);
    $replyEmail = $reply_email ? $reply_email : $from_email;
    $replyName = $reply_name ? $reply_name : $from_name;

    $mail->AddReplyTo($replyEmail, $replyName);
    $mail->Subject = $subject;
    $mail->MsgHTML($body);                                  //解析
    $mail->AddAddress($to, $name);
    if (is_array($attachment)) {                            // 添加附件
        foreach ($attachment as $file) {
            is_file($file) && $mail->AddAttachment($file);
        }
    }
    return $mail->Send() ? true : $mail->ErrorInfo;         //返回错误信息
}

/**
 * 分页，返回页码和内容
 * @param 字符串 $table1 数据表模型，开头字母大写如 User
 * @param int $pernum 每页显示条数
 * @param 数组或者字符串 $map 符合条件 数组形式或字符串 如 array('status'=>1)或"status=1"
 * @param 字符串 $order 排序规则 如 update_time desc 
 * @param 字符串 $join 连表查询字符串 如 table2_fullname ON table1_fullname.id = table2_fullname.id
 * @param string $field 检索字段
 * @param string $join2 第二连表
 * @return 数组 array("show_page"=>"分页", "list"=>"分页内容", 'total'=>总的条目数)
 */
function page($table, $pernum=12, $map="", $order="", $join="", $field="", $join2=''){

    $User = M($table); // 实例化User对象
    $count = $User->join($join)->join($join2)->where($map)->count(); // 查询满足要求的总记录数

    $Page = new \Think\Page($count, $pernum); // 实例化分页类 传入总记录数和每页显示的记录数()
    //分页跳转的时候保证查询条件
    foreach($map as $key=>$val) {
        $Page->parameter .= "$key=" . urlencode($val) . '&' ;
    }
    $show = $Page->show(); // 分页显示输出
    // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
    $list = $User->field($field)->join($join)->join($join2)->where($map)->order($order)->limit($Page->firstRow. ',' . $Page->listRows)->select();

    return array("total" => $count, "list" => $list, "show_page" => $show);
}

function pagetest($table, $pernum=12, $map="", $order="", $join="", $field="", $join2=''){

    $User = M($table); // 实例化User对象
    $count = $User->join($join)->where($map)->count(); // 查询满足要求的总记录数

    $Page = new \Think\Page($count, $pernum); // 实例化分页类 传入总记录数和每页显示的记录数()
    //分页跳转的时候保证查询条件
    foreach($map as $key=>$val) {
        $Page->parameter .= "$key=" . urlencode($val) . '&' ;
    }
    $show = $Page->show(); // 分页显示输出
    // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
    $list = $User->field($field)->join($join)->join($join2)->where($map)->order($order)->limit($Page->firstRow. ',' . $Page->listRows)->select();
    echo $User->_sql();
    return array("total" => $count, "list" => $list, "show_page" => $show);
}

//检查用户是否已登录
function is_login(){
    $userinfo = session('userinfo');
    if($userinfo != NULL){
        return $userinfo['id'];
    }
    return FALSE;
}

function is_administrator($id = null)
{
    $id = is_null($id) ? is_login() : $id;
    $admin_ids = explode(',', C('USER_ADMINISTRATOR'));//调整验证机制，支持多管理员，用,分隔
    //dump($admin_ids);exit;
    return $id && (in_array(intval($id), $admin_ids));//调整验证机制，支持多管理员，用,分隔
}

function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    // 创建Tree
    $tree = array();
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            } else {
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

/**
 * 通过大图的url获得小图的url——在路径中的图片名前面加small
 * @param type $url 大图url
 * @return string 小图url
 */
function get_small_pic($url){
    $head = substr($url, 0, strrpos($url, '/'));
    $tail = substr($url, strrpos($url, "/"));
    $small_url =  $head ."/small". $tail;
    return $small_url;
}

/**
 * 获取数据库配置中指定的配置，并将字符串配置转为数组
 * @param type $config 例：array("star_sign", "hair_style")
 * @return type 如上例返回star_sign 和 hair_style的数组配置 array("star_sign" => array(一维数组配置), "hair_style" => array(一维数组配置))
 */
function get_array_configs($config = array()){
    $configs = M("Config")->where(array("status" => 1))->getField("key, value, updatetime");
    foreach ($config as $key => $value){
//        strtoupper($string);
        unset($config[$key]);
        $config[$value] = explode(",", $configs[strtoupper($value)]['value']);
    }
    return $config;
}

/**
 * 讲数组转为where条件in的字符串
 * @param type $arr 数组
 */
function where_array_to_string($arr){
    //数组长度大于1
    if(count($arr)>1){
        $str = 'in (';
        foreach ($arr as $k => $v){
            if($k == count($arr)-1){
                $str .= $v . ')';
            } else {
                $str .= $v . ',';
            }
        }
    } else {    //数组长度为一
        $str = '= '.$arr[0];
    }
    return $str;
}

//检测验证码
function check_verify($code, $id=1){
    $verify = new \Think\Verify();
    return $verify->check($code, $id);
}

/**
 * 日志
 * @param type $word
 */
function logResult($word='') {
    $fp = fopen("./log.txt","a");
    flock($fp, LOCK_EX) ;
    fwrite($fp,"执行日期：".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");
    flock($fp, LOCK_UN);
    fclose($fp);
}

/**
 * 调用接口
 * @param type $url     接口url
 * @param type $method  调用方式
 * @param type $data    数据
 */
function execute_curl($url='', $method='post', $data=''){

    $ch = curl_init();
    //调用接口方式，待修改
    if(strtoupper($method) == 'POST'){
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ci, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
}

//自定义 获取图片OSS路径
function getimgurl($imgname){
    $config=C('FILE_UPLOAD_CONFIG');
    $exp=time()+3600*4;
    $string_to_sign="GET\n\n\n".$exp."\n/".$config['Alioss']['bucket_name']."/images/".$imgname;
    $access_key=$config['Alioss']['access_key_secret'];
    $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $access_key, true));
    $imgurl="http://static.yunmadou.13980.com/images/".$imgname."?Expires=".$exp."&OSSAccessKeyId=".$config['Alioss']['access_key_id']."&Signature=".rawurlencode($signature);
    return $imgurl;
}

/**
 * 消息添加
 * @param type $uid         消息通知的用户id
 * @param type $type        消息类型：1-系统消息，2-交易记录
 * @param type $subtype     消息子类型：系统消息（1-身份验证通过，2-身份验证未通过）交易记录（1-申请肖像权，2-邀请体验）
 * @param type $createtime  消息创建时间
 * @param type $content     消息内容（交易记录消息时，设定为交易记录【申请肖像权，邀请体验】id）
 * @param type $status      消息状态 0-未读；1-已读
 */
function createMessage($uid, $type, $index_id, $content){
    M('Message')->add(array(
        'uid'       => $uid,
        'type'      => $type,
        'index_id'   => $index_id,
        'createtime'=> NOW_TIME,
        'content'   => $content,
        'status'    => 0,
    ));
}

function jsonP($arr='', $callback){
    $tmp = json_encode($arr);
    echo $callback .'(' . $tmp . ')';
}